/// 
/// MaDAson - Toolkit for Model Driven Software Development
/// 
/// Copyright [2006] Marcus Lankenau
/// 
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///  
///     http://www.apache.org/licenses/LICENSE-2.0
///  
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
/// 

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace Madason.GenUtils
{
	/// <summary>
	/// The SensorWriter works just like a StreamWriter. Internally it's based on
	/// a StringWriter to buffer all you write away. When it comes to disposing the 
	/// object the SensorWriter reads the target file and compares the old content 
	/// with the content you have written to it. So the file is only touched if something
	/// changed. That helps when you have version control systems.
	/// </summary>
	public class SensorWriter : StringWriter
	{
		string filename;

		public SensorWriter(string filename)
		{
			this.filename = filename;
		}

		public override void Close()
		{
			base.Close();
		}

		protected override void Dispose(bool disposing)
		{
			Flush();
			string content = ToString();
			bool shallWrite = true;

			if (File.Exists(filename))
			{
				using (StreamReader reader = new StreamReader(filename))
				{
					string oldContent = reader.ReadToEnd();
					shallWrite = (oldContent != content);
				}
			}

			if (shallWrite)
			{
				using (StreamWriter writer = new StreamWriter(filename))
				{
					writer.Write(content);
					writer.Close();
				}
			}
			
			base.Dispose(disposing);
		}	
	}
}
